package com.briup.util;


import com.briup.Configuration;
import com.briup.entity.Environment;
import com.briup.support.ConfigurationAware;
import com.briup.support.PropertiesAware;

import java.io.*;
import java.util.Collection;
import java.util.Properties;

/**
 * 备份模块实现
 * 1.客户端向服务器发送数据
 * 2.入库的时候，服务端备份
 *
 * @author 崔宗祺
 * @Classname BackupImpl
 * @Description TODO
 * @Date 2023/11/22 17:20
 * @Created by 崔宗祺
 * @Version v1.0.0
 */
public class BackupImpl implements Backup, PropertiesAware , ConfigurationAware {
    /**
     * 数据恢复的方法
     * 文件 -》数据（对象）
     *
     * @param filePath 文件路径
     * @param del      读取完备份文件后是否要删除此备份文件，true为删除，false为不删除。在调用时推荐使用本接口中定义的静态常量LOAD_REMOVE、LOAD_UNREMOVE
     * @return {@link Object}
     * @throws Exception 例外
     */
    @Override
    public Object load(String filePath, boolean del) throws Exception {
        System.out.println("load---"+filePath);
        File file = new File(filePath);
        //判断备份数据 是否存在
        if (!file.exists() || file.isDirectory()) {
            //备份数据不存在
            return null;
//            throw new RuntimeException("备份文件异常！");
        }
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        Collection<Environment> collection = (Collection<Environment>) ois.readObject();
        ois.close();
        fis.close();
        if (del) {
            file.delete();
        }
        return collection;
    }

    /**
     * 数据备份的方法
     * 数据（对象） -》文件
     * 将需要备份的集合对象写入到备份文件
     *
     * @param filePath 备份文件的路径
     * @param obj      将要写入备份文件的对象
     * @param append   在写入时追加还是覆盖，true为追加，false为覆盖,在调用时推荐使用接口中定义的静态常量STORE_APPEND、STORE_OVERRIDE
     */
    @Override
    public void store(String filePath, Object obj, boolean append) throws Exception {
        File file = new File(filePath);
        FileOutputStream fos = new FileOutputStream(file, append);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(obj);
        oos.flush();
        oos.close();
        fos.close();
    }
    @Override
    public void init(Properties properties) throws Exception {
    }

    @Override
    public void setConfiguration(Configuration configuration) throws Exception {
    }
}